// ✅ 策略模块：select32ByS2.js（热冷号分析）
// 🎯 S2 策略：热冷号分析（HotCold）
// 选择最近期内未出现的号码（冷号）与高频号码（热号）各一部分组成

const _ = require("lodash");

/**
 * S2 策略：热冷号组合选择
 * @param {Array} temp - 当前窗口历史数据 [{ time, number }]
 * @returns {Array<string>} - 32 个号码（字符串格式）
 */
function select32ByS2(temp) {
  // 所有号码（01~49）
  const allNumbers = Array.from({ length: 49 }, (_, i) =>
    (i + 1).toString().padStart(2, '0')
  );

  // 记录每个号码最后一次出现的位置（越小越新）
  const lastSeenMap = {};
  const frequencyMap = {};

  for (let i = temp.length - 1; i >= 0; i--) {
    const num = temp[i].number.toString().padStart(2, '0');
    if (!lastSeenMap[num]) {
      lastSeenMap[num] = temp.length - i; // 越大表示越久没出现
    }
    frequencyMap[num] = (frequencyMap[num] || 0) + 1;
  }

  // 按照“未出现时间”降序排序（冷号在前）
  const sortedByCold = allNumbers
    .map((num) => ({ num, lastSeen: lastSeenMap[num] || Infinity }))
    .sort((a, b) => b.lastSeen - a.lastSeen)
    .map((item) => item.num);

  // 按照频率降序排序（热号在前）
  const sortedByHot = Object.entries(frequencyMap)
    .sort((a, b) => b[1] - a[1])
    .map(([num]) => num);

  // 冷号优先取 16 个
  const coldNumbers = sortedByCold.slice(0, 16);

  // 热号补 16 个（排除重复）
  const hotCandidates = _.uniq([...sortedByHot, ..._.shuffle(allNumbers)]);
  const hotNumbers = hotCandidates.filter(n => !coldNumbers.includes(n)).slice(0, 16);

  // 最终组合：冷号 + 热号
  const final = [...coldNumbers, ...hotNumbers];

  return final.slice(0, 32);
}

module.exports = select32ByS2;
